package com.jzo2o.market.utils;

import cn.hutool.core.util.RandomUtil;
import com.jzo2o.market.enums.CouponConfigTypeEnum;
import com.jzo2o.market.model.domain.CouponUser;

import java.math.BigDecimal;
import java.math.RoundingMode;

/**
 * 优惠券相关工具
 */
public class CouponUtils {
    /**
     * 兑换码基本字符，使用26个大写字母和2-9数字，易于人类阅读和传输
     */
    private static final String BASE_CHARS = "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567";

    /**
     * 兑换码长度
     */
    private static final int REDEEM_CODE_LENGTH = 6;

    /**
     * 计算优惠金额
     *
     * @param coupon      优惠券
     * @param totalAmount 订单金额
     * @return
     */
    public static BigDecimal calDiscountAmount(CouponUser coupon, BigDecimal totalAmount) {
        // 满减优惠
        if (CouponConfigTypeEnum.AMOUNT_DISCOUNT.equals(coupon.getType())) {
            //满减金额
            BigDecimal amountCondition = coupon.getAmountCondition();
            //优惠金额
            BigDecimal discountAmount = coupon.getDiscountAmount();
            //如果订单金额小于满减金额不满足优惠条件,如果优惠金额大于等于订单金额不满足优惠条件，此时返回优惠金额为0
            if (totalAmount.compareTo(amountCondition) < 0 || discountAmount.compareTo(totalAmount) >= 0) {
                return BigDecimal.ZERO;
            }
            return discountAmount;
        } else {//折扣优惠
            //折扣率
            Integer discountRate = coupon.getDiscountRate();
            //折扣率非法
            if (discountRate >= 100 || discountRate <= 0) return BigDecimal.ZERO;
            //优惠率
            BigDecimal rate = new BigDecimal(100 - coupon.getDiscountRate()).divide(new BigDecimal(100), 2, RoundingMode.DOWN);
            //优惠金额
            BigDecimal discountAmount = totalAmount.multiply(rate);
            return discountAmount;
        }
    }


    /**
     * 生成兑换码。
     * <p>
     * 该方法用于生成指定长度的兑换码，兑换码由预定义的基础字符集随机组成。
     * 基础字符集包含32个字符，确保兑换码的多样性。
     * 兑换码的长度由常量REDEEM_CODE_LENGTH定义，确保了兑换码的唯一性和长度的一致性。
     *
     * @return 生成的兑换码字符串。
     */
    public static String generateRedeemCode() {
        // 使用StringBuilder来高效构建兑换码字符串
        StringBuilder sb = new StringBuilder();
        // 循环REDEEM_CODE_LENGTH次，每次添加一个随机字符到StringBuilder中
        for (int i = 0; i < REDEEM_CODE_LENGTH; i++) {
            // 生成一个0到31的随机整数，用于索引基础字符集
            int index = RandomUtil.randomInt(0, BASE_CHARS.length());
            // 从基础字符集中获取随机字符，并追加到StringBuilder中
            sb.append(BASE_CHARS.charAt(index));
        }
        // 返回构建完成的兑换码字符串
        return sb.toString();
    }

}
